package com.day02;

/**
 * 运算符之五:位运算符
 * 结论:
 * 1.位运算符操作的都是整型的数据
 * 2.<<:在一定范围内，每向左移动一位，相当于  * 2;
 * >> :在一定范围内，每向右移动一位，相当于 / 2。被移位的二进制最高位是0，右移后，空缺位补0，最高位是1，空缺位补1
 * >>>:被移位二进制最高位无论是0还是1，空缺位都用0补。
 * &: 二进制进行&运算，只有1&1时，结果是1，否则是0
 * |: 二进制位进行|运算，只有0|0时结果还是0，否则是1
 * ^:相同二进制位进行^运算，结果是0，不相同二进制位结果是1
 * ~:正数取反，各二进制码按补码各位取反
 * 负数取反，各二进制码按补码各位取反
 * <p>
 * <p>
 * 面试题:最高效的方式计算2 * 8？ 2 << 3  或 8 << 1
 */
public class BitTest {
    public static void main(String[] args) {
        int i = 21;
        //左移和+号连接符是同一优先级，所以需要加上括号，否则就是从左像右走
        //每像左移一位，就是将数本身乘以2倍
        System.out.println("i << 2  :" + (i << 2));
        System.out.println("i << 3  :" + (i << 3));
        System.out.println("i << 27：" + (i << 27));
        System.out.println("2 << 3:" + (2 << 3));
        int m = 12;
        int n = 5;
        System.out.println("m & n :" + (m & n));
        System.out.println("m  | n :" + (m | n));
        System.out.println("m ^ n :" + (m ^ n));
        int a = ~6;
        System.out.println(a);

        //练习:交换两个变量的值。
        int num1 = 10;
        int num2 = 20;

        //方式一:
        int temp = num1;
        num1 = num2;
        num2 = temp;

        //方式二:
        num1 = num1 + num2;
        num2 = num1 - num2;
        num1 = num1 - num2;
        //方式三:
        //m = 13 n = 5 k = 8  k = m ^ n            m = k ^ n = (m ^ n) ^ n
        num1 = num1 ^ num2;
        num2 = num1 ^ num2;
        num1 = num1 ^ num2;

    }
}
